import axios from 'axios'
import { Toast } from 'vant'

// 创建 axios 实例
const request = axios.create({
  // 由于飞书 API 的特殊性，我们在生产环境也使用代理
  baseURL: '/api',  
  timeout: 30000,  // 增加超时时间到 30 秒
  retries: 2,      // 添加重试次数
  retryDelay: 1000 // 重试间隔时间
})

// 存储 token
let accessToken = '' // 飞书接口访问令牌

// 获取 tenant_access_token
const getTenantAccessToken = async () => {
  try {
    const res = await axios.post('/api/auth/v3/tenant_access_token/internal', {
      app_id: 'cli_a7be9a346eb3d00b',      
      app_secret: 'a2ObOxYJZezs0D71vczA8g0Z4sIzL47B'  
    })
    accessToken = res.data.tenant_access_token
    return accessToken
  } catch (error) {
    console.error('获取 token 失败')
    return null
  }
}

// 添加重试机制
const retryRequest = async (error) => {
  const config = error.config
  
  // 设置当前重试次数
  config.retryCount = config.retryCount || 0
  
  if (config.retryCount >= config.retries) {
    return Promise.reject(error)
  }
  
  config.retryCount += 1
  
  // 延迟重试
  const delay = new Promise((resolve) => {
    setTimeout(resolve, config.retryDelay || 1000)
  })
  
  // 重试请求
  await delay
  return request(config)
}

// 请求拦截器
request.interceptors.request.use(
  async config => {
    if (!accessToken) {
      accessToken = await getTenantAccessToken()
    }
    config.headers.Authorization = `Bearer ${accessToken}`
    config.headers['Content-Type'] = 'application/json'
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    return response.data
  },
  async error => {
    // 处理超时错误
    if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
      return retryRequest(error)
    }
    
    // 处理 401 错误
    if (error.response?.status === 401) {
      accessToken = ''
    }
    
    // 显示错误提示
    try {
      Toast.fail('网络请求失败，请稍后重试')
    } catch (e) {
      console.error('请求错误')
    }
    
    return Promise.reject(error)
  }
)

export default request 